import SSA.Core.WellTypedFramework import SSA.Projects.InstCombine.InstCombineBase import SSA.Projects.InstCombine.InstCombineAliveStatements open SSA InstCombine -- Name:AddSub:1043 -- precondition: true /- %Y = and %Z, C1 %X = xor %Y, C1 %LHS = add %X, 1 %r = add %LHS, %RHS => %or = or %Z, ~C1 %Y = and %Z, C1 %X = xor %Y, C1 %LHS = add %X, 1 %r = sub %RHS, %or -/ open SSA EDSL inexample : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ โ โ (Z C1 RHS : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 14 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 3 (TSSA.op (Op.not w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: TypeZZ: โC1C1: โRHS :RHS: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.4076TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โZ)) %v9999; %v2 := op:const (Bitvec.ofInt'Z: โw (w: โC1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andC1: โw %v3; %v5 := pair:%v4 %v2; %v6 := op:xorw: โw %v5; %v7 := op:const (Bitvec.ofInt'w: โw (w: โ1)) %v9999; %v8 := pair:%v6 %v7; %v9 := op:add1: ?m.5093w %v8; %v10 := op:const (Bitvec.ofInt'w: โw (w: โRHS)) %v9999; %v11 := pair:%v9 %v10; %v12 := op:addRHS: โw %v11 dsl_ret %v12 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.4076TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โZ)) %v9999; %v2 := op:const (Bitvec.ofInt'Z: โw (w: โC1)) %v9999; %v3 := op:notC1: โw %v2; %v4 := pair:%v1 %v3; %v5 := op:orw: โw %v4; %v6 := pair:%v1 %v2; %v7 := op:andw: โw %v6; %v8 := pair:%v7 %v2; %v9 := op:xorw: โw %v8; %v10 := op:const (Bitvec.ofInt'w: โw (w: โ1)) %v9999; %v11 := pair:%v9 %v10; %v12 := op:add1: ?m.8921w %v11; %v13 := op:const (Bitvec.ofInt'w: โw (w: โRHS)) %v9999; %v14 := pair:%v13 %v5; %v15 := op:subRHS: โw %v14 dsl_ret %v15 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ โ โ (Z C1 RHS : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 14 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 3 (TSSA.op (Op.not w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ โ โ (Z C1 RHS : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 14 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 3 (TSSA.op (Op.not w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ โ โ (Z C1 RHS : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 14 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 3 (TSSA.op (Op.not w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ โ โ (Z C1 RHS : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 14 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 3 (TSSA.op (Op.not w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ โ โ (Z C1 RHS : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 14 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 3 (TSSA.op (Op.not w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ โ โ (Z C1 RHS : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 14 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 3 (TSSA.op (Op.not w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ โ โ (Z C1 RHS : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 14 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 3 (TSSA.op (Op.not w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS')) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ')) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 14 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS')) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 3 (TSSA.op (Op.not w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ')) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ โ โ (Z C1 RHS : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 14 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 3 (TSSA.op (Op.not w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' w โZ') let x_1 โ some (Bitvec.ofInt' w โC1) let x_2 โ some (Bitvec.ofInt' w โC1) let x_3 โ some (Bitvec.ofInt' w 1) let fst โ Bitvec.add? (Bitvec.xor (Bitvec.and x x_1) x_2) x_3 let snd โ some (Bitvec.ofInt' w โRHS') Bitvec.add? fst snd) โ do let fst โ some (Bitvec.ofInt' w โRHS') let x โ some (Bitvec.ofInt' w โZ') let x_1 โ some (Bitvec.not (Bitvec.ofInt' w โC1)) pure (Bitvec.sub fst (Bitvec.or x x_1))โ (w : โ), โ โ โ โ โ โ โ (Z C1 RHS : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 14 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 3 (TSSA.op (Op.not w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(Option.bind (Bitvec.add? (Bitvec.xor (Bitvec.and (Bitvec.ofInt' w โZ') (Bitvec.ofInt' w โC1)) (Bitvec.ofInt' w โC1)) (Bitvec.ofInt' w 1)) fun fst => Bitvec.add? fst (Bitvec.ofInt' w โRHS')) โ some (Bitvec.sub (Bitvec.ofInt' w โRHS') (Bitvec.or (Bitvec.ofInt' w โZ') (Bitvec.not (Bitvec.ofInt' w โC1))))โ (w : โ), โ โ โ โ โ โ โ (Z C1 RHS : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 14 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 3 (TSSA.op (Op.not w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AddSub:1152 -- precondition: true /- %r = add i1 %x, %y => %r = xor %x, %y -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typexx: โy :y: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.247824TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โx)) %v9999; %v2 := op:const (Bitvec.ofInt'x: โw (w: โy)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:addy: โw %v3 dsl_ret %v4 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.247824TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โx)) %v9999; %v2 := op:const (Bitvec.ofInt'x: โw (w: โy)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xory: โw %v3 dsl_ret %v4 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.add wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โyโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โxโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โyโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โxโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let fst โ some (Bitvec.ofInt' wโ โxโ) let snd โ some (Bitvec.ofInt' wโ โyโ) Bitvec.add? fst snd) โ do let fst โ some (Bitvec.ofInt' wโ โxโ) let snd โ some (Bitvec.ofInt' wโ โyโ) pure (Bitvec.xor fst snd)โ (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eBitvec.add? (Bitvec.ofInt' wโ โxโ) (Bitvec.ofInt' wโ โyโ) โ some (Bitvec.xor (Bitvec.ofInt' wโ โxโ) (Bitvec.ofInt' wโ โyโ))โ (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AddSub:1164 -- precondition: true /- %na = sub 0, %a %c = add %na, %b => %na = sub 0, %a %c = sub %b, %a -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typeaa: โb :b: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.316757TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โ0)) %v9999; %v2 := op:const (Bitvec.ofInt'0: ?m.318373w (w: โa)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:suba: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โb)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:addb: โw %v6 dsl_ret %v7 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.316757TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โ0)) %v9999; %v2 := op:const (Bitvec.ofInt'0: ?m.320659w (w: โa)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:suba: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โb)) %v9999; %v6 := pair:%v5 %v2; %v7 := op:subb: โw %v6 dsl_ret %v7 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ 0) let x_1 โ some (Bitvec.ofInt' wโ โaโ) let snd โ some (Bitvec.ofInt' wโ โbโ) Bitvec.add? (Bitvec.sub x x_1) snd) โ do let fst โ some (Bitvec.ofInt' wโ โbโ) let snd โ some (Bitvec.ofInt' wโ โaโ) pure (Bitvec.sub fst snd)โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eBitvec.add? (Bitvec.sub (Bitvec.ofInt' wโ 0) (Bitvec.ofInt' wโ โaโ)) (Bitvec.ofInt' wโ โbโ) โ some (Bitvec.sub (Bitvec.ofInt' wโ โbโ) (Bitvec.ofInt' wโ โaโ))โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AddSub:1165 -- precondition: true /- %na = sub 0, %a %nb = sub 0, %b %c = add %na, %nb => %ab = add %a, %b %na = sub 0, %a %nb = sub 0, %b %c = sub 0, %ab -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typeaa: โb :b: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.442305TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โ0)) %v9999; %v2 := op:const (Bitvec.ofInt'0: ?m.444939w (w: โa)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:suba: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โ0)) %v9999; %v6 := op:const (Bitvec.ofInt'0: ?m.443308w (w: โb)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:subb: โw %v7; %v9 := pair:%v4 %v8; %v10 := op:addw: โw %v9 dsl_ret %v10 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.442305TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โb)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:addb: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โ0)) %v9999; %v6 := pair:%v5 %v1; %v7 := op:sub0: ?m.447248w %v6; %v8 := op:const (Bitvec.ofInt'w: โw (w: โ0)) %v9999; %v9 := pair:%v8 %v2; %v10 := op:sub0: ?m.446745w %v9; %v11 := op:const (Bitvec.ofInt'w: โw (w: โ0)) %v9999; %v12 := pair:%v11 %v4; %v13 := op:sub0: ?m.446200w %v12 dsl_ret %v13 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.add wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' wโ 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' wโ 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ 0) let x_1 โ some (Bitvec.ofInt' wโ โaโ) let x_2 โ some (Bitvec.ofInt' wโ 0) let x_3 โ some (Bitvec.ofInt' wโ โbโ) Bitvec.add? (Bitvec.sub x x_1) (Bitvec.sub x_2 x_3)) โ do let fst โ some (Bitvec.ofInt' wโ 0) let x โ some (Bitvec.ofInt' wโ โaโ) let x_1 โ some (Bitvec.ofInt' wโ โbโ) let snd โ Bitvec.add? x x_1 pure (Bitvec.sub fst snd)โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eBitvec.add? (Bitvec.sub (Bitvec.ofInt' wโ 0) (Bitvec.ofInt' wโ โaโ)) (Bitvec.sub (Bitvec.ofInt' wโ 0) (Bitvec.ofInt' wโ โbโ)) โ Option.bind (Bitvec.add? (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ)) fun snd => some (Bitvec.sub (Bitvec.ofInt' wโ 0) snd)โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AddSub:1176 -- precondition: true /- %nb = sub 0, %b %c = add %a, %nb => %nb = sub 0, %b %c = sub %a, %b -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (b a : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typebb: โa :a: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.637263TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โ0)) %v9999; %v2 := op:const (Bitvec.ofInt'0: ?m.638879w (w: โb)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:subb: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v6 := pair:%v5 %v4; %v7 := op:adda: โw %v6 dsl_ret %v7 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.637263TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โ0)) %v9999; %v2 := op:const (Bitvec.ofInt'0: ?m.641165w (w: โb)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:subb: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v6 := pair:%v5 %v2; %v7 := op:suba: โw %v6 dsl_ret %v7 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (b a : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (b a : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let fst โ some (Bitvec.ofInt' wโ โaโ) let x โ some (Bitvec.ofInt' wโ 0) let x_1 โ some (Bitvec.ofInt' wโ โbโ) Bitvec.add? fst (Bitvec.sub x x_1)) โ do let fst โ some (Bitvec.ofInt' wโ โaโ) let snd โ some (Bitvec.ofInt' wโ โbโ) pure (Bitvec.sub fst snd)โ (w : โ), โ โ โ โ โ (b a : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eBitvec.add? (Bitvec.ofInt' wโ โaโ) (Bitvec.sub (Bitvec.ofInt' wโ 0) (Bitvec.ofInt' wโ โbโ)) โ some (Bitvec.sub (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ))โ (w : โ), โ โ โ โ โ (b a : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AddSub:1295 -- precondition: true /- %aab = and %a, %b %aob = xor %a, %b %c = add %aab, %aob => %aab = and %a, %b %aob = xor %a, %b %c = or %a, %b -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typeaa: โb :b: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.762529TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โb)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andb: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:xorw: โw %v5; %v7 := pair:%v4 %v6; %v8 := op:addw: โw %v7 dsl_ret %v8 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.762529TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โb)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andb: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:xorw: โw %v5; %v7 := pair:%v1 %v2; %v8 := op:orw: โw %v7 dsl_ret %v8 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โaโ) let x_1 โ some (Bitvec.ofInt' wโ โbโ) let x_2 โ some (Bitvec.ofInt' wโ โaโ) let x_3 โ some (Bitvec.ofInt' wโ โbโ) Bitvec.add? (Bitvec.and x x_1) (Bitvec.xor x_2 x_3)) โ do let fst โ some (Bitvec.ofInt' wโ โaโ) let snd โ some (Bitvec.ofInt' wโ โbโ) pure (Bitvec.or fst snd)โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eBitvec.add? (Bitvec.and (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ)) (Bitvec.xor (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ)) โ some (Bitvec.or (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ))โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AddSub:1309 -- precondition: true /- %lhs = and %a, %b %rhs = or %a, %b %c = add %lhs, %rhs => %lhs = and %a, %b %rhs = or %a, %b %c = add %a, %b -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typeaa: โb :b: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.920591TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โb)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andb: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:orw: โw %v5; %v7 := pair:%v4 %v6; %v8 := op:addw: โw %v7 dsl_ret %v8 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.920591TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โb)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andb: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:orw: โw %v5; %v7 := pair:%v1 %v2; %v8 := op:addw: โw %v7 dsl_ret %v8 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โaโ) let x_1 โ some (Bitvec.ofInt' wโ โbโ) let x_2 โ some (Bitvec.ofInt' wโ โaโ) let x_3 โ some (Bitvec.ofInt' wโ โbโ) Bitvec.add? (Bitvec.and x x_1) (Bitvec.or x_2 x_3)) โ do let fst โ some (Bitvec.ofInt' wโ โaโ) let snd โ some (Bitvec.ofInt' wโ โbโ) Bitvec.add? fst sndโ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eBitvec.add? (Bitvec.and (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ)) (Bitvec.or (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ)) โ Bitvec.add? (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ)โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AddSub:1309-2 -- precondition: true /- %lhs = and %a, %b %rhs = or %a, %b %c = add nsw %lhs, %rhs => %lhs = and %a, %b %rhs = or %a, %b %c = add nsw %a, %b -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typeaa: โb :b: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1076916TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โb)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andb: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:orw: โw %v5; %v7 := pair:%v4 %v6; %v8 := op:addw: โw %v7 dsl_ret %v8 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1076916TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โb)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andb: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:orw: โw %v5; %v7 := pair:%v1 %v2; %v8 := op:addw: โw %v7 dsl_ret %v8 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โaโ) let x_1 โ some (Bitvec.ofInt' wโ โbโ) let x_2 โ some (Bitvec.ofInt' wโ โaโ) let x_3 โ some (Bitvec.ofInt' wโ โbโ) Bitvec.add? (Bitvec.and x x_1) (Bitvec.or x_2 x_3)) โ do let fst โ some (Bitvec.ofInt' wโ โaโ) let snd โ some (Bitvec.ofInt' wโ โbโ) Bitvec.add? fst sndโ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eBitvec.add? (Bitvec.and (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ)) (Bitvec.or (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ)) โ Bitvec.add? (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ)โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AddSub:1309-3 -- precondition: true /- %lhs = and %a, %b %rhs = or %a, %b %c = add nuw %lhs, %rhs => %lhs = and %a, %b %rhs = or %a, %b %c = add nuw %a, %b -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typeaa: โb :b: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1233241TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โb)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andb: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:orw: โw %v5; %v7 := pair:%v4 %v6; %v8 := op:addw: โw %v7 dsl_ret %v8 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1233241TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โb)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andb: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:orw: โw %v5; %v7 := pair:%v1 %v2; %v8 := op:addw: โw %v7 dsl_ret %v8 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โaโ) let x_1 โ some (Bitvec.ofInt' wโ โbโ) let x_2 โ some (Bitvec.ofInt' wโ โaโ) let x_3 โ some (Bitvec.ofInt' wโ โbโ) Bitvec.add? (Bitvec.and x x_1) (Bitvec.or x_2 x_3)) โ do let fst โ some (Bitvec.ofInt' wโ โaโ) let snd โ some (Bitvec.ofInt' wโ โbโ) Bitvec.add? fst sndโ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eBitvec.add? (Bitvec.and (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ)) (Bitvec.or (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ)) โ Bitvec.add? (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ)โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AddSub:1539 -- precondition: true /- %na = sub 0, %a %r = sub %x, %na => %na = sub 0, %a %r = add %x, %a -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (a x : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typeaa: โx :x: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1389815TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โ0)) %v9999; %v2 := op:const (Bitvec.ofInt'0: ?m.1391431w (w: โa)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:suba: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โx)) %v9999; %v6 := pair:%v5 %v4; %v7 := op:subx: โw %v6 dsl_ret %v7 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1389815TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โ0)) %v9999; %v2 := op:const (Bitvec.ofInt'0: ?m.1393717w (w: โa)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:suba: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โx)) %v9999; %v6 := pair:%v5 %v2; %v7 := op:addx: โw %v6 dsl_ret %v7 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (a x : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โxโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โxโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (a x : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let fst โ some (Bitvec.ofInt' wโ โxโ) let x โ some (Bitvec.ofInt' wโ 0) let x_1 โ some (Bitvec.ofInt' wโ โaโ) pure (Bitvec.sub fst (Bitvec.sub x x_1))) โ do let fst โ some (Bitvec.ofInt' wโ โxโ) let snd โ some (Bitvec.ofInt' wโ โaโ) Bitvec.add? fst sndโ (w : โ), โ โ โ โ โ (a x : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.sub (Bitvec.ofInt' wโ โxโ) (Bitvec.sub (Bitvec.ofInt' wโ 0) (Bitvec.ofInt' wโ โaโ))) โ Bitvec.add? (Bitvec.ofInt' wโ โxโ) (Bitvec.ofInt' wโ โaโ)โ (w : โ), โ โ โ โ โ (a x : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AddSub:1546 -- precondition: true /- %na = sub nsw 0, %a %r = sub nsw %x, %na => %na = sub nsw 0, %a %r = add nsw %x, %a -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (a x : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typeaa: โx :x: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1515504TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โ0)) %v9999; %v2 := op:const (Bitvec.ofInt'0: ?m.1517120w (w: โa)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:suba: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โx)) %v9999; %v6 := pair:%v5 %v4; %v7 := op:subx: โw %v6 dsl_ret %v7 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1515504TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โ0)) %v9999; %v2 := op:const (Bitvec.ofInt'0: ?m.1519406w (w: โa)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:suba: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โx)) %v9999; %v6 := pair:%v5 %v2; %v7 := op:addx: โw %v6 dsl_ret %v7 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (a x : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โxโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โxโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (a x : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let fst โ some (Bitvec.ofInt' wโ โxโ) let x โ some (Bitvec.ofInt' wโ 0) let x_1 โ some (Bitvec.ofInt' wโ โaโ) pure (Bitvec.sub fst (Bitvec.sub x x_1))) โ do let fst โ some (Bitvec.ofInt' wโ โxโ) let snd โ some (Bitvec.ofInt' wโ โaโ) Bitvec.add? fst sndโ (w : โ), โ โ โ โ โ (a x : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.sub (Bitvec.ofInt' wโ โxโ) (Bitvec.sub (Bitvec.ofInt' wโ 0) (Bitvec.ofInt' wโ โaโ))) โ Bitvec.add? (Bitvec.ofInt' wโ โxโ) (Bitvec.ofInt' wโ โaโ)โ (w : โ), โ โ โ โ โ (a x : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AddSub:1556 -- precondition: true /- %r = sub i1 %x, %y => %r = xor %x, %y -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typexx: โy :y: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1640180TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โx)) %v9999; %v2 := op:const (Bitvec.ofInt'x: โw (w: โy)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:suby: โw %v3 dsl_ret %v4 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1640180TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โx)) %v9999; %v2 := op:const (Bitvec.ofInt'x: โw (w: โy)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xory: โw %v3 dsl_ret %v4 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โyโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โxโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โyโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โxโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let fst โ some (Bitvec.ofInt' wโ โxโ) let snd โ some (Bitvec.ofInt' wโ โyโ) pure (Bitvec.sub fst snd)) โ do let fst โ some (Bitvec.ofInt' wโ โxโ) let snd โ some (Bitvec.ofInt' wโ โyโ) pure (Bitvec.xor fst snd)โ (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.sub (Bitvec.ofInt' wโ โxโ) (Bitvec.ofInt' wโ โyโ)) โ some (Bitvec.xor (Bitvec.ofInt' wโ โxโ) (Bitvec.ofInt' wโ โyโ))โ (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AddSub:1560 -- precondition: true /- %r = sub -1, %a => %r = xor %a, -1 -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ (a : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typeaa: โa :a: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1710042TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v2 := op:const (Bitvec.ofInt'1: ?m.1710636w (w: โa)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:suba: โw %v3 dsl_ret %v4 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1710042TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.1712127w %v3 dsl_ret %v4 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ (a : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ (a : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let fst โ some (Bitvec.ofInt' wโ (-1)) let snd โ some (Bitvec.ofInt' wโ โaโ) pure (Bitvec.sub fst snd)) โ do let fst โ some (Bitvec.ofInt' wโ โaโ) let snd โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.xor fst snd)โ (w : โ), โ โ โ (a : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.sub (Bitvec.ofInt' wโ (-1)) (Bitvec.ofInt' wโ โaโ)) โ some (Bitvec.xor (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ (-1)))โ (w : โ), โ โ โ (a : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AddSub:1614 -- precondition: true /- %Op1 = add %X, %Y %r = sub %X, %Op1 => %Op1 = add %X, %Y %r = sub 0, %Y -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (X Y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: TypeXX: โY :Y: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1806225TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โX)) %v9999; %v2 := op:const (Bitvec.ofInt'X: โw (w: โY)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:addY: โw %v3; %v5 := pair:%v1 %v4; %v6 := op:subw: โw %v5 dsl_ret %v6 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1806225TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โX)) %v9999; %v2 := op:const (Bitvec.ofInt'X: โw (w: โY)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:addY: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โ0)) %v9999; %v6 := pair:%v5 %v2; %v7 := op:sub0: ?m.1808429w %v6 dsl_ret %v7 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (X Y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โYโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โXโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โYโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โXโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (X Y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let fst โ some (Bitvec.ofInt' wโ โXโ) let x โ some (Bitvec.ofInt' wโ โXโ) let x_1 โ some (Bitvec.ofInt' wโ โYโ) let snd โ Bitvec.add? x x_1 pure (Bitvec.sub fst snd)) โ do let fst โ some (Bitvec.ofInt' wโ 0) let snd โ some (Bitvec.ofInt' wโ โYโ) pure (Bitvec.sub fst snd)โ (w : โ), โ โ โ โ โ (X Y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(Option.bind (Bitvec.add? (Bitvec.ofInt' wโ โXโ) (Bitvec.ofInt' wโ โYโ)) fun snd => some (Bitvec.sub (Bitvec.ofInt' wโ โXโ) snd)) โ some (Bitvec.sub (Bitvec.ofInt' wโ 0) (Bitvec.ofInt' wโ โYโ))โ (w : โ), โ โ โ โ โ (X Y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AddSub:1619 -- precondition: true /- %Op0 = sub %X, %Y %r = sub %Op0, %X => %Op0 = sub %X, %Y %r = sub 0, %Y -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (X Y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: TypeXX: โY :Y: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1932478TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โX)) %v9999; %v2 := op:const (Bitvec.ofInt'X: โw (w: โY)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:subY: โw %v3; %v5 := pair:%v4 %v1; %v6 := op:subw: โw %v5 dsl_ret %v6 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1932478TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โX)) %v9999; %v2 := op:const (Bitvec.ofInt'X: โw (w: โY)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:subY: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โ0)) %v9999; %v6 := pair:%v5 %v2; %v7 := op:sub0: ?m.1934682w %v6 dsl_ret %v7 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (X Y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โYโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โXโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โYโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โXโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (X Y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โXโ) let x_1 โ some (Bitvec.ofInt' wโ โYโ) let snd โ some (Bitvec.ofInt' wโ โXโ) pure (Bitvec.sub (Bitvec.sub x x_1) snd)) โ do let fst โ some (Bitvec.ofInt' wโ 0) let snd โ some (Bitvec.ofInt' wโ โYโ) pure (Bitvec.sub fst snd)โ (w : โ), โ โ โ โ โ (X Y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.sub (Bitvec.sub (Bitvec.ofInt' wโ โXโ) (Bitvec.ofInt' wโ โYโ)) (Bitvec.ofInt' wโ โXโ)) โ some (Bitvec.sub (Bitvec.ofInt' wโ 0) (Bitvec.ofInt' wโ โYโ))โ (w : โ), โ โ โ โ โ (X Y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AddSub:1624 -- precondition: true /- %Op0 = or %A, %B %Op1 = xor %A, %B %r = sub %Op0, %Op1 => %Op0 = or %A, %B %Op1 = xor %A, %B %r = and %A, %B -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: TypeAA: โB :B: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.2059102TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:orB: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:xorw: โw %v5; %v7 := pair:%v4 %v6; %v8 := op:subw: โw %v7 dsl_ret %v8 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.2059102TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:orB: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:xorw: โw %v5; %v7 := pair:%v1 %v2; %v8 := op:andw: โw %v7 dsl_ret %v8 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ โBโ) let x_2 โ some (Bitvec.ofInt' wโ โAโ) let x_3 โ some (Bitvec.ofInt' wโ โBโ) pure (Bitvec.sub (Bitvec.or x x_1) (Bitvec.xor x_2 x_3))) โ do let fst โ some (Bitvec.ofInt' wโ โAโ) let snd โ some (Bitvec.ofInt' wโ โBโ) pure (Bitvec.and fst snd)โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.sub (Bitvec.or (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ)) (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ))) โ some (Bitvec.and (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ))โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:1230 ~A & ~B -> ~(A | B) -- precondition: true /- %op0 = xor %notOp0, -1 %op1 = xor %notOp1, -1 %r = and %op0, %op1 => %or = or %notOp0, %notOp1 %op0 = xor %notOp0, -1 %op1 = xor %notOp1, -1 %r = xor %or, -1 -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (notOp0 notOp1 : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: TypenotOp0notOp0: โnotOp1 :notOp1: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.2219750TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โnotOp0)) %v9999; %v2 := op:const (Bitvec.ofInt'notOp0: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.2222047w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โnotOp1)) %v9999; %v6 := op:const (Bitvec.ofInt'notOp1: โw (-w: โ1)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor1: ?m.2220507w %v7; %v9 := pair:%v4 %v8; %v10 := op:andw: โw %v9 dsl_ret %v10 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.2219750TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โnotOp0)) %v9999; %v2 := op:const (Bitvec.ofInt'notOp0: โw (w: โnotOp1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:ornotOp1: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v6 := pair:%v1 %v5; %v7 := op:xor1: ?m.2224529w %v6; %v8 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v9 := pair:%v2 %v8; %v10 := op:xor1: ?m.2224004w %v9; %v11 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v12 := pair:%v4 %v11; %v13 := op:xor1: ?m.2223436w %v12 dsl_ret %v13 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (notOp0 notOp1 : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โnotOp1โ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โnotOp0โ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โnotOp1โ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โnotOp0โ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (notOp0 notOp1 : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โnotOp0โ) let x_1 โ some (Bitvec.ofInt' wโ (-1)) let x_2 โ some (Bitvec.ofInt' wโ โnotOp1โ) let x_3 โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.and (Bitvec.xor x x_1) (Bitvec.xor x_2 x_3))) โ do let x โ some (Bitvec.ofInt' wโ โnotOp0โ) let x_1 โ some (Bitvec.ofInt' wโ โnotOp1โ) let snd โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.xor (Bitvec.or x x_1) snd)โ (w : โ), โ โ โ โ โ (notOp0 notOp1 : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.and (Bitvec.xor (Bitvec.ofInt' wโ โnotOp0โ) (Bitvec.ofInt' wโ (-1))) (Bitvec.xor (Bitvec.ofInt' wโ โnotOp1โ) (Bitvec.ofInt' wโ (-1)))) โ some (Bitvec.xor (Bitvec.or (Bitvec.ofInt' wโ โnotOp0โ) (Bitvec.ofInt' wโ โnotOp1โ)) (Bitvec.ofInt' wโ (-1)))โ (w : โ), โ โ โ โ โ (notOp0 notOp1 : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:1241 (A|B) & ~(A&B) => A^B -- precondition: true /- %op0 = or %A, %B %notOp1 = and %A, %B %op1 = xor %notOp1, -1 %r = and %op0, %op1 => %op0 = or %A, %B %notOp1 = and %A, %B %op1 = xor %notOp1, -1 %r = xor %A, %B -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: TypeAA: โBB: โAA: โB :B: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.2418392TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:orB: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:andw: โw %v5; %v7 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v8 := pair:%v6 %v7; %v9 := op:xor1: ?m.2419157w %v8; %v10 := pair:%v4 %v9; %v11 := op:andw: โw %v10 dsl_ret %v11 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.2418392TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:orB: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:andw: โw %v5; %v7 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v8 := pair:%v6 %v7; %v9 := op:xor1: ?m.2422943w %v8; %v10 := pair:%v1 %v2; %v11 := op:xorw: โw %v10 dsl_ret %v11 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ โBโ) let x_2 โ some (Bitvec.ofInt' wโ โAโ) let x_3 โ some (Bitvec.ofInt' wโ โBโ) let x_4 โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.and (Bitvec.or x x_1) (Bitvec.xor (Bitvec.and x_2 x_3) x_4))) โ do let fst โ some (Bitvec.ofInt' wโ โAโ) let snd โ some (Bitvec.ofInt' wโ โBโ) pure (Bitvec.xor fst snd)โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.and (Bitvec.or (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ)) (Bitvec.xor (Bitvec.and (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ)) (Bitvec.ofInt' wโ (-1)))) โ some (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ))โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:1247 ~(A&B) & (A|B) => A^B -- precondition: true /- %notOp0 = and %A, %B %op0 = xor %notOp0, -1 %op1 = or %A, %B %r = and %op0, %op1 => %notOp0 = and %A, %B %op0 = xor %notOp0, -1 %op1 = or %A, %B %r = xor %A, %B -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: TypeAA: โBB: โAA: โB :B: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.2624140TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andB: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:xor1: ?m.2625308w %v6; %v8 := pair:%v1 %v2; %v9 := op:orw: โw %v8; %v10 := pair:%v7 %v9; %v11 := op:andw: โw %v10 dsl_ret %v11 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.2624140TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andB: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:xor1: ?m.2629023w %v6; %v8 := pair:%v1 %v2; %v9 := op:orw: โw %v8; %v10 := pair:%v1 %v2; %v11 := op:xorw: โw %v10 dsl_ret %v11 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ โBโ) let x_2 โ some (Bitvec.ofInt' wโ (-1)) let x_3 โ some (Bitvec.ofInt' wโ โAโ) let x_4 โ some (Bitvec.ofInt' wโ โBโ) pure (Bitvec.and (Bitvec.xor (Bitvec.and x x_1) x_2) (Bitvec.or x_3 x_4))) โ do let fst โ some (Bitvec.ofInt' wโ โAโ) let snd โ some (Bitvec.ofInt' wโ โBโ) pure (Bitvec.xor fst snd)โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.and (Bitvec.xor (Bitvec.and (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ)) (Bitvec.ofInt' wโ (-1))) (Bitvec.or (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ))) โ some (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ))โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:1253 A & (A^B) -> A & ~B -- precondition: true /- %op0 = xor %A, %B %r = and %op0, %A => %notB = xor %B, -1 %op0 = xor %A, %B %r = and %A, %notB -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: TypeAA: โBB: โBB: โA :A: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.2827013TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xorB: โw %v3; %v5 := pair:%v4 %v1; %v6 := op:andw: โw %v5 dsl_ret %v6 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.2827013TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v2 := op:const (Bitvec.ofInt'B: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.2830074w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v6 := pair:%v5 %v1; %v7 := op:xorA: โw %v6; %v8 := pair:%v5 %v4; %v9 := op:andw: โw %v8 dsl_ret %v9 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ โBโ) let snd โ some (Bitvec.ofInt' wโ โAโ) pure (Bitvec.and (Bitvec.xor x x_1) snd)) โ do let fst โ some (Bitvec.ofInt' wโ โAโ) let x โ some (Bitvec.ofInt' wโ โBโ) let x_1 โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.and fst (Bitvec.xor x x_1))โ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.and (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ)) (Bitvec.ofInt' wโ โAโ)) โ some (Bitvec.and (Bitvec.ofInt' wโ โAโ) (Bitvec.xor (Bitvec.ofInt' wโ โBโ) (Bitvec.ofInt' wโ (-1))))โ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:1280 (~A|B)&A -> A&B -- precondition: true /- %nA = xor %A, -1 %op0 = or %nA, %B %r = and %op0, %A => %nA = xor %A, -1 %op0 = or %nA, %B %r = and %A, %B -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: TypeAA: โBB: โAA: โB :B: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.2989568TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.2990929w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:orB: โw %v6; %v8 := pair:%v7 %v1; %v9 := op:andw: โw %v8 dsl_ret %v9 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.2989568TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.2993944w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:orB: โw %v6; %v8 := pair:%v1 %v5; %v9 := op:andw: โw %v8 dsl_ret %v9 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ (-1)) let x_2 โ some (Bitvec.ofInt' wโ โBโ) let snd โ some (Bitvec.ofInt' wโ โAโ) pure (Bitvec.and (Bitvec.or (Bitvec.xor x x_1) x_2) snd)) โ do let fst โ some (Bitvec.ofInt' wโ โAโ) let snd โ some (Bitvec.ofInt' wโ โBโ) pure (Bitvec.and fst snd)โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.and (Bitvec.or (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.ofInt' wโ โBโ)) (Bitvec.ofInt' wโ โAโ)) โ some (Bitvec.and (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ))โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:1288 (A ^ B) & ((B ^ C) ^ A) -> (A ^ B) & ~C -- precondition: true /- %op0 = xor %A, %B %x = xor %B, %C %op1 = xor %x, %A %r = and %op0, %op1 => %op0 = xor %A, %B %negC = xor %C, -1 %x = xor %B, %C %op1 = xor %x, %A %r = and %op0, %negC -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ โ โ (A B C : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: TypeAA: โBB: โCC: โAA: โBB: โC :C: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.3158596TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xorB: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โC)) %v9999; %v6 := pair:%v2 %v5; %v7 := op:xorC: โw %v6; %v8 := pair:%v7 %v1; %v9 := op:xorw: โw %v8; %v10 := pair:%v4 %v9; %v11 := op:andw: โw %v10 dsl_ret %v11 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.3158596TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xorB: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โC)) %v9999; %v6 := op:const (Bitvec.ofInt'C: โw (-w: โ1)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor1: ?m.3163393w %v7; %v9 := pair:%v2 %v5; %v10 := op:xorw: โw %v9; %v11 := pair:%v10 %v1; %v12 := op:xorw: โw %v11; %v13 := pair:%v4 %v8; %v14 := op:andw: โw %v13 dsl_ret %v14 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ โ โ (A B C : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โCโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โCโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ โ โ (A B C : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ โBโ) let x_2 โ some (Bitvec.ofInt' wโ โBโ) let x_3 โ some (Bitvec.ofInt' wโ โCโ) let x_4 โ some (Bitvec.ofInt' wโ โAโ) pure (Bitvec.and (Bitvec.xor x x_1) (Bitvec.xor (Bitvec.xor x_2 x_3) x_4))) โ do let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ โBโ) let x_2 โ some (Bitvec.ofInt' wโ โCโ) let x_3 โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.and (Bitvec.xor x x_1) (Bitvec.xor x_2 x_3))โ (w : โ), โ โ โ โ โ โ โ (A B C : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.and (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ)) (Bitvec.xor (Bitvec.xor (Bitvec.ofInt' wโ โBโ) (Bitvec.ofInt' wโ โCโ)) (Bitvec.ofInt' wโ โAโ))) โ some (Bitvec.and (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ)) (Bitvec.xor (Bitvec.ofInt' wโ โCโ) (Bitvec.ofInt' wโ (-1))))โ (w : โ), โ โ โ โ โ โ โ (A B C : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:1294 (A | B) & ((~A) ^ B) -> (A & B) -- precondition: true /- %op0 = or %A, %B %x = xor %A, -1 %op1 = xor %x, %B %r = and %op0, %op1 => %op0 = or %A, %B %x = xor %A, -1 %op1 = xor %x, %B %r = and %A, %B -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: TypeAA: โBB: โAA: โB :B: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.3429011TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:orB: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v6 := pair:%v1 %v5; %v7 := op:xor1: ?m.3430178w %v6; %v8 := pair:%v7 %v2; %v9 := op:xorw: โw %v8; %v10 := pair:%v4 %v9; %v11 := op:andw: โw %v10 dsl_ret %v11 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.3429011TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:orB: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v6 := pair:%v1 %v5; %v7 := op:xor1: ?m.3433966w %v6; %v8 := pair:%v7 %v2; %v9 := op:xorw: โw %v8; %v10 := pair:%v1 %v2; %v11 := op:andw: โw %v10 dsl_ret %v11 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ โBโ) let x_2 โ some (Bitvec.ofInt' wโ โAโ) let x_3 โ some (Bitvec.ofInt' wโ (-1)) let x_4 โ some (Bitvec.ofInt' wโ โBโ) pure (Bitvec.and (Bitvec.or x x_1) (Bitvec.xor (Bitvec.xor x_2 x_3) x_4))) โ do let fst โ some (Bitvec.ofInt' wโ โAโ) let snd โ some (Bitvec.ofInt' wโ โBโ) pure (Bitvec.and fst snd)โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.and (Bitvec.or (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ)) (Bitvec.xor (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.ofInt' wโ โBโ))) โ some (Bitvec.and (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ))โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2113 ((~A & B) | A) -> (A | B) -- precondition: true /- %negA = xor %A, -1 %op0 = and %negA, %B %r = or %op0, %A => %negA = xor %A, -1 %op0 = and %negA, %B %r = or %A, %B -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: TypeAA: โBB: โAA: โB :B: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.3634181TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.3635542w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:andB: โw %v6; %v8 := pair:%v7 %v1; %v9 := op:orw: โw %v8 dsl_ret %v9 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.3634181TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.3638557w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:andB: โw %v6; %v8 := pair:%v1 %v5; %v9 := op:orw: โw %v8 dsl_ret %v9 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ (-1)) let x_2 โ some (Bitvec.ofInt' wโ โBโ) let snd โ some (Bitvec.ofInt' wโ โAโ) pure (Bitvec.or (Bitvec.and (Bitvec.xor x x_1) x_2) snd)) โ do let fst โ some (Bitvec.ofInt' wโ โAโ) let snd โ some (Bitvec.ofInt' wโ โBโ) pure (Bitvec.or fst snd)โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.or (Bitvec.and (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.ofInt' wโ โBโ)) (Bitvec.ofInt' wโ โAโ)) โ some (Bitvec.or (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ))โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2118 ((A & B) | ~A) -> (~A | B) -- precondition: true /- %negA = xor %A, -1 %op0 = and %A, %B %r = or %op0, %negA => %negA = xor %A, -1 %op0 = and %A, %B %r = or %negA, %B -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: TypeAA: โBB: โAA: โB :B: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.3803113TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.3804474w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v6 := pair:%v1 %v5; %v7 := op:andB: โw %v6; %v8 := pair:%v7 %v4; %v9 := op:orw: โw %v8 dsl_ret %v9 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.3803113TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.3807489w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v6 := pair:%v1 %v5; %v7 := op:andB: โw %v6; %v8 := pair:%v4 %v5; %v9 := op:orw: โw %v8 dsl_ret %v9 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ โBโ) let x_2 โ some (Bitvec.ofInt' wโ โAโ) let x_3 โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.or (Bitvec.and x x_1) (Bitvec.xor x_2 x_3))) โ do let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ (-1)) let snd โ some (Bitvec.ofInt' wโ โBโ) pure (Bitvec.or (Bitvec.xor x x_1) snd)โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.or (Bitvec.and (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ)) (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ (-1)))) โ some (Bitvec.or (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.ofInt' wโ โBโ))โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2123 (A & (~B)) | (A ^ B) -> (A ^ B) -- precondition: true /- %negB = xor %B, -1 %op0 = and %A, %negB %op1 = xor %A, %B %r = or %op0, %op1 => %negB = xor %B, -1 %op0 = and %A, %negB %op1 = xor %A, %B %r = xor %A, %B -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: TypeBB: โAA: โBB: โA :A: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.3975052TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v2 := op:const (Bitvec.ofInt'B: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.3976785w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v6 := pair:%v5 %v4; %v7 := op:andA: โw %v6; %v8 := pair:%v5 %v1; %v9 := op:xorw: โw %v8; %v10 := pair:%v7 %v9; %v11 := op:orw: โw %v10 dsl_ret %v11 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.3975052TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v2 := op:const (Bitvec.ofInt'B: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.3980140w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v6 := pair:%v5 %v4; %v7 := op:andA: โw %v6; %v8 := pair:%v5 %v1; %v9 := op:xorw: โw %v8; %v10 := pair:%v5 %v1; %v11 := op:xorw: โw %v10 dsl_ret %v11 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ โBโ) let x_2 โ some (Bitvec.ofInt' wโ (-1)) let x_3 โ some (Bitvec.ofInt' wโ โAโ) let x_4 โ some (Bitvec.ofInt' wโ โBโ) pure (Bitvec.or (Bitvec.and x (Bitvec.xor x_1 x_2)) (Bitvec.xor x_3 x_4))) โ do let fst โ some (Bitvec.ofInt' wโ โAโ) let snd โ some (Bitvec.ofInt' wโ โBโ) pure (Bitvec.xor fst snd)โ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.or (Bitvec.and (Bitvec.ofInt' wโ โAโ) (Bitvec.xor (Bitvec.ofInt' wโ โBโ) (Bitvec.ofInt' wโ (-1)))) (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ))) โ some (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ))โ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2188 -- precondition: true /- %C = xor %D, -1 %B = xor %A, -1 %op0 = and %A, %C %op1 = and %B, %D %r = or %op0, %op1 => %C = xor %D, -1 %B = xor %A, -1 %op0 = and %A, %C %op1 = and %B, %D %r = xor %A, %D -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (D A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โD)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โD)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: TypeDD: โA :A: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.4176163TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โD)) %v9999; %v2 := op:const (Bitvec.ofInt'D: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.4179258w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v6 := op:const (Bitvec.ofInt'A: โw (-w: โ1)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor1: ?m.4177724w %v7; %v9 := pair:%v5 %v4; %v10 := op:andw: โw %v9; %v11 := pair:%v8 %v1; %v12 := op:andw: โw %v11; %v13 := pair:%v10 %v12; %v14 := op:orw: โw %v13 dsl_ret %v14 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.4176163TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โD)) %v9999; %v2 := op:const (Bitvec.ofInt'D: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.4183210w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v6 := op:const (Bitvec.ofInt'A: โw (-w: โ1)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor1: ?m.4181702w %v7; %v9 := pair:%v5 %v4; %v10 := op:andw: โw %v9; %v11 := pair:%v8 %v1; %v12 := op:andw: โw %v11; %v13 := pair:%v5 %v1; %v14 := op:xorw: โw %v13 dsl_ret %v14 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (D A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โD)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โD)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โDโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โDโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (D A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โD)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โD)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ โDโ) let x_2 โ some (Bitvec.ofInt' wโ (-1)) let x_3 โ some (Bitvec.ofInt' wโ โAโ) let x_4 โ some (Bitvec.ofInt' wโ (-1)) let x_5 โ some (Bitvec.ofInt' wโ โDโ) pure (Bitvec.or (Bitvec.and x (Bitvec.xor x_1 x_2)) (Bitvec.and (Bitvec.xor x_3 x_4) x_5))) โ do let fst โ some (Bitvec.ofInt' wโ โAโ) let snd โ some (Bitvec.ofInt' wโ โDโ) pure (Bitvec.xor fst snd)โ (w : โ), โ โ โ โ โ (D A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โD)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โD)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.or (Bitvec.and (Bitvec.ofInt' wโ โAโ) (Bitvec.xor (Bitvec.ofInt' wโ โDโ) (Bitvec.ofInt' wโ (-1)))) (Bitvec.and (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.ofInt' wโ โDโ))) โ some (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โDโ))โ (w : โ), โ โ โ โ โ (D A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โD)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โD)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2231 (A ^ B) | ((B ^ C) ^ A) -> (A ^ B) | C -- precondition: true /- %op0 = xor %A, %B %x = xor %B, %C %op1 = xor %x, %A %r = or %op0, %op1 => %op0 = xor %A, %B %x = xor %B, %C %op1 = xor %x, %A %r = or %op0, %C -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ โ โ (A B C : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: TypeAA: โBB: โC :C: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.4418668TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xorB: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โC)) %v9999; %v6 := pair:%v2 %v5; %v7 := op:xorC: โw %v6; %v8 := pair:%v7 %v1; %v9 := op:xorw: โw %v8; %v10 := pair:%v4 %v9; %v11 := op:orw: โw %v10 dsl_ret %v11 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.4418668TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xorB: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โC)) %v9999; %v6 := pair:%v2 %v5; %v7 := op:xorC: โw %v6; %v8 := pair:%v7 %v1; %v9 := op:xorw: โw %v8; %v10 := pair:%v4 %v5; %v11 := op:orw: โw %v10 dsl_ret %v11 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ โ โ (A B C : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โCโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โCโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ โ โ (A B C : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ โBโ) let x_2 โ some (Bitvec.ofInt' wโ โBโ) let x_3 โ some (Bitvec.ofInt' wโ โCโ) let x_4 โ some (Bitvec.ofInt' wโ โAโ) pure (Bitvec.or (Bitvec.xor x x_1) (Bitvec.xor (Bitvec.xor x_2 x_3) x_4))) โ do let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ โBโ) let snd โ some (Bitvec.ofInt' wโ โCโ) pure (Bitvec.or (Bitvec.xor x x_1) snd)โ (w : โ), โ โ โ โ โ โ โ (A B C : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.or (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ)) (Bitvec.xor (Bitvec.xor (Bitvec.ofInt' wโ โBโ) (Bitvec.ofInt' wโ โCโ)) (Bitvec.ofInt' wโ โAโ))) โ some (Bitvec.or (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ)) (Bitvec.ofInt' wโ โCโ))โ (w : โ), โ โ โ โ โ โ โ (A B C : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2243 ((B | C) & A) | B -> B | (A & C) -- precondition: true /- %o = or %B, %C %op0 = and %o, %A %r = or %op0, %B => %a = and %A, %C %o = or %B, %C %op0 = and %o, %A %r = or %B, %a -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ โ โ (A C B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: TypeAA: โCC: โB :B: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.4625941TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v2 := op:const (Bitvec.ofInt'B: โw (w: โC)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:orC: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:andA: โw %v6; %v8 := pair:%v7 %v1; %v9 := op:orw: โw %v8 dsl_ret %v9 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.4625941TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โC)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andC: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v6 := pair:%v5 %v2; %v7 := op:orB: โw %v6; %v8 := pair:%v7 %v1; %v9 := op:andw: โw %v8; %v10 := pair:%v5 %v4; %v11 := op:orw: โw %v10 dsl_ret %v11 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ โ โ (A C B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โCโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โCโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ โ โ (A C B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โBโ) let x_1 โ some (Bitvec.ofInt' wโ โCโ) let x_2 โ some (Bitvec.ofInt' wโ โAโ) let snd โ some (Bitvec.ofInt' wโ โBโ) pure (Bitvec.or (Bitvec.and (Bitvec.or x x_1) x_2) snd)) โ do let fst โ some (Bitvec.ofInt' wโ โBโ) let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ โCโ) pure (Bitvec.or fst (Bitvec.and x x_1))โ (w : โ), โ โ โ โ โ โ โ (A C B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.or (Bitvec.and (Bitvec.or (Bitvec.ofInt' wโ โBโ) (Bitvec.ofInt' wโ โCโ)) (Bitvec.ofInt' wโ โAโ)) (Bitvec.ofInt' wโ โBโ)) โ some (Bitvec.or (Bitvec.ofInt' wโ โBโ) (Bitvec.and (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โCโ)))โ (w : โ), โ โ โ โ โ โ โ (A C B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2247 (~A | ~B) == (~(A & B)) -- precondition: true /- %na = xor %A, -1 %nb = xor %B, -1 %r = or %na, %nb => %a = and %A, %B %na = xor %A, -1 %nb = xor %B, -1 %r = xor %a, -1 -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: TypeAA: โB :B: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.4824467TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.4826764w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v6 := op:const (Bitvec.ofInt'B: โw (-w: โ1)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor1: ?m.4825224w %v7; %v9 := pair:%v4 %v8; %v10 := op:orw: โw %v9 dsl_ret %v10 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.4824467TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andB: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v6 := pair:%v1 %v5; %v7 := op:xor1: ?m.4829246w %v6; %v8 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v9 := pair:%v2 %v8; %v10 := op:xor1: ?m.4828721w %v9; %v11 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v12 := pair:%v4 %v11; %v13 := op:xor1: ?m.4828153w %v12 dsl_ret %v13 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ (-1)) let x_2 โ some (Bitvec.ofInt' wโ โBโ) let x_3 โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.or (Bitvec.xor x x_1) (Bitvec.xor x_2 x_3))) โ do let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ โBโ) let snd โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.xor (Bitvec.and x x_1) snd)โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.or (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.xor (Bitvec.ofInt' wโ โBโ) (Bitvec.ofInt' wโ (-1)))) โ some (Bitvec.xor (Bitvec.and (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ)) (Bitvec.ofInt' wโ (-1)))โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2263 -- precondition: true /- %op1 = xor %op0, %B %r = or %op0, %op1 => %op1 = xor %op0, %B %r = or %op0, %B -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (op0 B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โop0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โop0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typeop0op0: โB :B: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.5021075TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โop0)) %v9999; %v2 := op:const (Bitvec.ofInt'op0: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xorB: โw %v3; %v5 := pair:%v1 %v4; %v6 := op:orw: โw %v5 dsl_ret %v6 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.5021075TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โop0)) %v9999; %v2 := op:const (Bitvec.ofInt'op0: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xorB: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:orw: โw %v5 dsl_ret %v6 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (op0 B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โop0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โop0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โop0โ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โop0โ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (op0 B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โop0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โop0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let fst โ some (Bitvec.ofInt' wโ โop0โ) let x โ some (Bitvec.ofInt' wโ โop0โ) let x_1 โ some (Bitvec.ofInt' wโ โBโ) pure (Bitvec.or fst (Bitvec.xor x x_1))) โ do let fst โ some (Bitvec.ofInt' wโ โop0โ) let snd โ some (Bitvec.ofInt' wโ โBโ) pure (Bitvec.or fst snd)โ (w : โ), โ โ โ โ โ (op0 B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โop0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โop0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.or (Bitvec.ofInt' wโ โop0โ) (Bitvec.xor (Bitvec.ofInt' wโ โop0โ) (Bitvec.ofInt' wโ โBโ))) โ some (Bitvec.or (Bitvec.ofInt' wโ โop0โ) (Bitvec.ofInt' wโ โBโ))โ (w : โ), โ โ โ โ โ (op0 B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โop0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โop0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2264 -- precondition: true /- %na = xor %A, -1 %op1 = xor %na, %B %r = or %A, %op1 => %nb = xor %B, -1 %na = xor %A, -1 %op1 = xor %na, %B %r = or %A, %nb -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: TypeBB: โA :A: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.5146931TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.5148292w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:xorB: โw %v6; %v8 := pair:%v1 %v7; %v9 := op:orw: โw %v8 dsl_ret %v9 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.5146931TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v2 := op:const (Bitvec.ofInt'B: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.5152690w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v6 := op:const (Bitvec.ofInt'A: โw (-w: โ1)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor1: ?m.5151176w %v7; %v9 := pair:%v8 %v1; %v10 := op:xorw: โw %v9; %v11 := pair:%v5 %v4; %v12 := op:orw: โw %v11 dsl_ret %v12 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let fst โ some (Bitvec.ofInt' wโ โAโ) let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ (-1)) let x_2 โ some (Bitvec.ofInt' wโ โBโ) pure (Bitvec.or fst (Bitvec.xor (Bitvec.xor x x_1) x_2))) โ do let fst โ some (Bitvec.ofInt' wโ โAโ) let x โ some (Bitvec.ofInt' wโ โBโ) let x_1 โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.or fst (Bitvec.xor x x_1))โ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.or (Bitvec.ofInt' wโ โAโ) (Bitvec.xor (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.ofInt' wโ โBโ))) โ some (Bitvec.or (Bitvec.ofInt' wโ โAโ) (Bitvec.xor (Bitvec.ofInt' wโ โBโ) (Bitvec.ofInt' wโ (-1))))โ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2265 -- precondition: true /- %op0 = and %A, %B %op1 = xor %A, %B %r = or %op0, %op1 => %op0 = and %A, %B %op1 = xor %A, %B %r = or %A, %B -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: TypeAA: โB :B: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.5345753TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andB: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:xorw: โw %v5; %v7 := pair:%v4 %v6; %v8 := op:orw: โw %v7 dsl_ret %v8 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.5345753TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andB: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:xorw: โw %v5; %v7 := pair:%v1 %v2; %v8 := op:orw: โw %v7 dsl_ret %v8 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ โBโ) let x_2 โ some (Bitvec.ofInt' wโ โAโ) let x_3 โ some (Bitvec.ofInt' wโ โBโ) pure (Bitvec.or (Bitvec.and x x_1) (Bitvec.xor x_2 x_3))) โ do let fst โ some (Bitvec.ofInt' wโ โAโ) let snd โ some (Bitvec.ofInt' wโ โBโ) pure (Bitvec.or fst snd)โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.or (Bitvec.and (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ)) (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ))) โ some (Bitvec.or (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ))โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2284 -- precondition: true /- %o = or %A, %B %op1 = xor %o, -1 %r = or %A, %op1 => %not = xor %B, -1 %o = or %A, %B %op1 = xor %o, -1 %r = or %A, %not -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: TypeBB: โA :A: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.5506454TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:orB: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:xor1: ?m.5507227w %v6; %v8 := pair:%v1 %v7; %v9 := op:orw: โw %v8 dsl_ret %v9 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.5506454TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v2 := op:const (Bitvec.ofInt'B: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.5512492w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v6 := pair:%v5 %v1; %v7 := op:orA: โw %v6; %v8 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v9 := pair:%v7 %v8; %v10 := op:xor1: ?m.5510593w %v9; %v11 := pair:%v5 %v4; %v12 := op:orw: โw %v11 dsl_ret %v12 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let fst โ some (Bitvec.ofInt' wโ โAโ) let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ โBโ) let x_2 โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.or fst (Bitvec.xor (Bitvec.or x x_1) x_2))) โ do let fst โ some (Bitvec.ofInt' wโ โAโ) let x โ some (Bitvec.ofInt' wโ โBโ) let x_1 โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.or fst (Bitvec.xor x x_1))โ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.or (Bitvec.ofInt' wโ โAโ) (Bitvec.xor (Bitvec.or (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ)) (Bitvec.ofInt' wโ (-1)))) โ some (Bitvec.or (Bitvec.ofInt' wโ โAโ) (Bitvec.xor (Bitvec.ofInt' wโ โBโ) (Bitvec.ofInt' wโ (-1))))โ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2285 -- precondition: true /- %o = xor %A, %B %op1 = xor %o, -1 %r = or %A, %op1 => %not = xor %B, -1 %o = xor %A, %B %op1 = xor %o, -1 %r = or %A, %not -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: TypeBB: โA :A: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.5706759TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xorB: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:xor1: ?m.5707532w %v6; %v8 := pair:%v1 %v7; %v9 := op:orw: โw %v8 dsl_ret %v9 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.5706759TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v2 := op:const (Bitvec.ofInt'B: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.5712797w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v6 := pair:%v5 %v1; %v7 := op:xorA: โw %v6; %v8 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v9 := pair:%v7 %v8; %v10 := op:xor1: ?m.5710898w %v9; %v11 := pair:%v5 %v4; %v12 := op:orw: โw %v11 dsl_ret %v12 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let fst โ some (Bitvec.ofInt' wโ โAโ) let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ โBโ) let x_2 โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.or fst (Bitvec.xor (Bitvec.xor x x_1) x_2))) โ do let fst โ some (Bitvec.ofInt' wโ โAโ) let x โ some (Bitvec.ofInt' wโ โBโ) let x_1 โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.or fst (Bitvec.xor x x_1))โ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.or (Bitvec.ofInt' wโ โAโ) (Bitvec.xor (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ)) (Bitvec.ofInt' wโ (-1)))) โ some (Bitvec.or (Bitvec.ofInt' wโ โAโ) (Bitvec.xor (Bitvec.ofInt' wโ โBโ) (Bitvec.ofInt' wโ (-1))))โ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2297 -- precondition: true /- %op0 = and %A, %B %na = xor %A, -1 %op1 = xor %na, %B %r = or %op0, %op1 => %na = xor %A, -1 %op0 = and %A, %B %op1 = xor %na, %B %r = xor %na, %B -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: TypeAA: โBB: โAA: โB :B: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.5907464TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andB: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v6 := pair:%v1 %v5; %v7 := op:xor1: ?m.5908631w %v6; %v8 := pair:%v7 %v2; %v9 := op:xorw: โw %v8; %v10 := pair:%v4 %v9; %v11 := op:orw: โw %v10 dsl_ret %v11 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.5907464TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.5912838w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v6 := pair:%v1 %v5; %v7 := op:andB: โw %v6; %v8 := pair:%v4 %v5; %v9 := op:xorw: โw %v8; %v10 := pair:%v4 %v5; %v11 := op:xorw: โw %v10 dsl_ret %v11 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ โBโ) let x_2 โ some (Bitvec.ofInt' wโ โAโ) let x_3 โ some (Bitvec.ofInt' wโ (-1)) let x_4 โ some (Bitvec.ofInt' wโ โBโ) pure (Bitvec.or (Bitvec.and x x_1) (Bitvec.xor (Bitvec.xor x_2 x_3) x_4))) โ do let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ (-1)) let snd โ some (Bitvec.ofInt' wโ โBโ) pure (Bitvec.xor (Bitvec.xor x x_1) snd)โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.or (Bitvec.and (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ)) (Bitvec.xor (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.ofInt' wโ โBโ))) โ some (Bitvec.xor (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.ofInt' wโ โBโ))โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2367 -- precondition: true /- %op0 = or %A, C1 %r = or %op0, %op1 => %i = or %A, %op1 %op0 = or %A, C1 %r = or %i, C1 -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ โ โ (A op1 C1 : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: TypeAA: โop1op1: โC1 :C1: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.6134632TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โC1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:orC1: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โop1)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:orop1: โw %v6 dsl_ret %v7 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.6134632TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โop1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:orop1: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โC1)) %v9999; %v6 := pair:%v1 %v5; %v7 := op:orC1: โw %v6; %v8 := pair:%v4 %v5; %v9 := op:orw: โw %v8 dsl_ret %v9 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ โ โ (A op1 C1 : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โop1โ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โC1โ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โC1โ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โop1โ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ โ โ (A op1 C1 : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ โC1โ) let snd โ some (Bitvec.ofInt' wโ โop1โ) pure (Bitvec.or (Bitvec.or x x_1) snd)) โ do let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ โop1โ) let snd โ some (Bitvec.ofInt' wโ โC1โ) pure (Bitvec.or (Bitvec.or x x_1) snd)โ (w : โ), โ โ โ โ โ โ โ (A op1 C1 : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.or (Bitvec.or (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โC1โ)) (Bitvec.ofInt' wโ โop1โ)) โ some (Bitvec.or (Bitvec.or (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โop1โ)) (Bitvec.ofInt' wโ โC1โ))โ (w : โ), โ โ โ โ โ โ โ (A op1 C1 : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2416 -- precondition: true /- %x = xor %nx, -1 %op0 = and %x, %y %r = xor %op0, -1 => %ny = xor %y, -1 %x = xor %nx, -1 %op0 = and %x, %y %r = or %nx, %ny -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (y nx : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typeyy: โnx :nx: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.6295542TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โnx)) %v9999; %v2 := op:const (Bitvec.ofInt'nx: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.6297833w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โy)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:andy: โw %v6; %v8 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v9 := pair:%v7 %v8; %v10 := op:xor1: ?m.6295923w %v9 dsl_ret %v10 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.6295542TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โy)) %v9999; %v2 := op:const (Bitvec.ofInt'y: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.6301405w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โnx)) %v9999; %v6 := op:const (Bitvec.ofInt'nx: โw (-w: โ1)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor1: ?m.6299897w %v7; %v9 := pair:%v8 %v1; %v10 := op:andw: โw %v9; %v11 := pair:%v5 %v4; %v12 := op:orw: โw %v11 dsl_ret %v12 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (y nx : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โyโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โnxโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โnxโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โyโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (y nx : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โnxโ) let x_1 โ some (Bitvec.ofInt' wโ (-1)) let x_2 โ some (Bitvec.ofInt' wโ โyโ) let snd โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.xor (Bitvec.and (Bitvec.xor x x_1) x_2) snd)) โ do let fst โ some (Bitvec.ofInt' wโ โnxโ) let x โ some (Bitvec.ofInt' wโ โyโ) let x_1 โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.or fst (Bitvec.xor x x_1))โ (w : โ), โ โ โ โ โ (y nx : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.xor (Bitvec.and (Bitvec.xor (Bitvec.ofInt' wโ โnxโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.ofInt' wโ โyโ)) (Bitvec.ofInt' wโ (-1))) โ some (Bitvec.or (Bitvec.ofInt' wโ โnxโ) (Bitvec.xor (Bitvec.ofInt' wโ โyโ) (Bitvec.ofInt' wโ (-1))))โ (w : โ), โ โ โ โ โ (y nx : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2417 -- precondition: true /- %x = xor %nx, -1 %op0 = or %x, %y %r = xor %op0, -1 => %ny = xor %y, -1 %x = xor %nx, -1 %op0 = or %x, %y %r = and %nx, %ny -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (y nx : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typeyy: โnx :nx: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.6496334TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โnx)) %v9999; %v2 := op:const (Bitvec.ofInt'nx: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.6498625w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โy)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:ory: โw %v6; %v8 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v9 := pair:%v7 %v8; %v10 := op:xor1: ?m.6496715w %v9 dsl_ret %v10 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.6496334TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โy)) %v9999; %v2 := op:const (Bitvec.ofInt'y: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.6502197w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โnx)) %v9999; %v6 := op:const (Bitvec.ofInt'nx: โw (-w: โ1)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor1: ?m.6500689w %v7; %v9 := pair:%v8 %v1; %v10 := op:orw: โw %v9; %v11 := pair:%v5 %v4; %v12 := op:andw: โw %v11 dsl_ret %v12 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (y nx : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โyโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โnxโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โnxโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โyโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (y nx : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โnxโ) let x_1 โ some (Bitvec.ofInt' wโ (-1)) let x_2 โ some (Bitvec.ofInt' wโ โyโ) let snd โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.xor (Bitvec.or (Bitvec.xor x x_1) x_2) snd)) โ do let fst โ some (Bitvec.ofInt' wโ โnxโ) let x โ some (Bitvec.ofInt' wโ โyโ) let x_1 โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.and fst (Bitvec.xor x x_1))โ (w : โ), โ โ โ โ โ (y nx : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.xor (Bitvec.or (Bitvec.xor (Bitvec.ofInt' wโ โnxโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.ofInt' wโ โyโ)) (Bitvec.ofInt' wโ (-1))) โ some (Bitvec.and (Bitvec.ofInt' wโ โnxโ) (Bitvec.xor (Bitvec.ofInt' wโ โyโ) (Bitvec.ofInt' wโ (-1))))โ (w : โ), โ โ โ โ โ (y nx : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2429 -- precondition: true /- %op0 = and %x, %y %r = xor %op0, -1 => %nx = xor %x, -1 %ny = xor %y, -1 %op0 = and %x, %y %r = or %nx, %ny -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typexx: โy :y: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.6696868TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โx)) %v9999; %v2 := op:const (Bitvec.ofInt'x: โw (w: โy)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andy: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:xor1: ?m.6697249w %v6 dsl_ret %v7 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.6696868TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โx)) %v9999; %v2 := op:const (Bitvec.ofInt'x: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.6702526w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โy)) %v9999; %v6 := op:const (Bitvec.ofInt'y: โw (-w: โ1)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor1: ?m.6701014w %v7; %v9 := pair:%v1 %v5; %v10 := op:andw: โw %v9; %v11 := pair:%v4 %v8; %v12 := op:orw: โw %v11 dsl_ret %v12 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โyโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โxโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โyโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โxโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โxโ) let x_1 โ some (Bitvec.ofInt' wโ โyโ) let snd โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.xor (Bitvec.and x x_1) snd)) โ do let x โ some (Bitvec.ofInt' wโ โxโ) let x_1 โ some (Bitvec.ofInt' wโ (-1)) let x_2 โ some (Bitvec.ofInt' wโ โyโ) let x_3 โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.or (Bitvec.xor x x_1) (Bitvec.xor x_2 x_3))โ (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.xor (Bitvec.and (Bitvec.ofInt' wโ โxโ) (Bitvec.ofInt' wโ โyโ)) (Bitvec.ofInt' wโ (-1))) โ some (Bitvec.or (Bitvec.xor (Bitvec.ofInt' wโ โxโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.xor (Bitvec.ofInt' wโ โyโ) (Bitvec.ofInt' wโ (-1))))โ (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2430 -- precondition: true /- %op0 = or %x, %y %r = xor %op0, -1 => %nx = xor %x, -1 %ny = xor %y, -1 %op0 = or %x, %y %r = and %nx, %ny -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typexx: โy :y: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.6894003TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โx)) %v9999; %v2 := op:const (Bitvec.ofInt'x: โw (w: โy)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:ory: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:xor1: ?m.6894384w %v6 dsl_ret %v7 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.6894003TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โx)) %v9999; %v2 := op:const (Bitvec.ofInt'x: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.6899661w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โy)) %v9999; %v6 := op:const (Bitvec.ofInt'y: โw (-w: โ1)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor1: ?m.6898149w %v7; %v9 := pair:%v1 %v5; %v10 := op:orw: โw %v9; %v11 := pair:%v4 %v8; %v12 := op:andw: โw %v11 dsl_ret %v12 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โyโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โxโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โyโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โxโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โxโ) let x_1 โ some (Bitvec.ofInt' wโ โyโ) let snd โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.xor (Bitvec.or x x_1) snd)) โ do let x โ some (Bitvec.ofInt' wโ โxโ) let x_1 โ some (Bitvec.ofInt' wโ (-1)) let x_2 โ some (Bitvec.ofInt' wโ โyโ) let x_3 โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.and (Bitvec.xor x x_1) (Bitvec.xor x_2 x_3))โ (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.xor (Bitvec.or (Bitvec.ofInt' wโ โxโ) (Bitvec.ofInt' wโ โyโ)) (Bitvec.ofInt' wโ (-1))) โ some (Bitvec.and (Bitvec.xor (Bitvec.ofInt' wโ โxโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.xor (Bitvec.ofInt' wโ โyโ) (Bitvec.ofInt' wโ (-1))))โ (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2581 (B|A)^B -> A & ~B -- precondition: true /- %op0 = or %a, %op1 %r = xor %op0, %op1 => %nop1 = xor %op1, -1 %op0 = or %a, %op1 %r = and %a, %nop1 -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (op1 a : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typeaa: โop1op1: โop1op1: โa :a: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.7089892TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โop1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:orop1: โw %v3; %v5 := pair:%v4 %v2; %v6 := op:xorw: โw %v5 dsl_ret %v6 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.7089892TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โop1)) %v9999; %v2 := op:const (Bitvec.ofInt'op1: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.7092945w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v6 := pair:%v5 %v1; %v7 := op:ora: โw %v6; %v8 := pair:%v5 %v4; %v9 := op:andw: โw %v8 dsl_ret %v9 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (op1 a : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โop1โ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โop1โ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (op1 a : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โaโ) let x_1 โ some (Bitvec.ofInt' wโ โop1โ) let snd โ some (Bitvec.ofInt' wโ โop1โ) pure (Bitvec.xor (Bitvec.or x x_1) snd)) โ do let fst โ some (Bitvec.ofInt' wโ โaโ) let x โ some (Bitvec.ofInt' wโ โop1โ) let x_1 โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.and fst (Bitvec.xor x x_1))โ (w : โ), โ โ โ โ โ (op1 a : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.xor (Bitvec.or (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โop1โ)) (Bitvec.ofInt' wโ โop1โ)) โ some (Bitvec.and (Bitvec.ofInt' wโ โaโ) (Bitvec.xor (Bitvec.ofInt' wโ โop1โ) (Bitvec.ofInt' wโ (-1))))โ (w : โ), โ โ โ โ โ (op1 a : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2587 (B&A)^A -> ~B & A -- precondition: true /- %op0 = and %a, %op1 %r = xor %op0, %op1 => %na = xor %a, -1 %op0 = and %a, %op1 %r = and %na, %op1 -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (a op1 : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typeaa: โop1op1: โaa: โop1 :op1: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.7251074TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โop1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andop1: โw %v3; %v5 := pair:%v4 %v2; %v6 := op:xorw: โw %v5 dsl_ret %v6 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.7251074TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.7254127w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โop1)) %v9999; %v6 := pair:%v1 %v5; %v7 := op:andop1: โw %v6; %v8 := pair:%v4 %v5; %v9 := op:andw: โw %v8 dsl_ret %v9 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (a op1 : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โop1โ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โop1โ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (a op1 : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โaโ) let x_1 โ some (Bitvec.ofInt' wโ โop1โ) let snd โ some (Bitvec.ofInt' wโ โop1โ) pure (Bitvec.xor (Bitvec.and x x_1) snd)) โ do let x โ some (Bitvec.ofInt' wโ โaโ) let x_1 โ some (Bitvec.ofInt' wโ (-1)) let snd โ some (Bitvec.ofInt' wโ โop1โ) pure (Bitvec.and (Bitvec.xor x x_1) snd)โ (w : โ), โ โ โ โ โ (a op1 : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.xor (Bitvec.and (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โop1โ)) (Bitvec.ofInt' wโ โop1โ)) โ some (Bitvec.and (Bitvec.xor (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.ofInt' wโ โop1โ))โ (w : โ), โ โ โ โ โ (a op1 : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2595 -- precondition: true /- %op0 = and %a, %b %op1 = or %a, %b %r = xor %op0, %op1 => %op0 = and %a, %b %op1 = or %a, %b %r = xor %a, %b -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typeaa: โb :b: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.7412521TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โb)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andb: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:orw: โw %v5; %v7 := pair:%v4 %v6; %v8 := op:xorw: โw %v7 dsl_ret %v8 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.7412521TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โb)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andb: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:orw: โw %v5; %v7 := pair:%v1 %v2; %v8 := op:xorw: โw %v7 dsl_ret %v8 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โaโ) let x_1 โ some (Bitvec.ofInt' wโ โbโ) let x_2 โ some (Bitvec.ofInt' wโ โaโ) let x_3 โ some (Bitvec.ofInt' wโ โbโ) pure (Bitvec.xor (Bitvec.and x x_1) (Bitvec.or x_2 x_3))) โ do let fst โ some (Bitvec.ofInt' wโ โaโ) let snd โ some (Bitvec.ofInt' wโ โbโ) pure (Bitvec.xor fst snd)โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.xor (Bitvec.and (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ)) (Bitvec.or (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ))) โ some (Bitvec.xor (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ))โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2607 -- precondition: true /- %na = xor %a, -1 %nb = xor %b, -1 %op0 = or %a, %nb %op1 = or %na, %b %r = xor %op0, %op1 => %na = xor %a, -1 %nb = xor %b, -1 %op0 = or %a, %nb %op1 = or %na, %b %r = xor %a, %b -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typeaa: โb :b: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.7573911TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.7577008w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โb)) %v9999; %v6 := op:const (Bitvec.ofInt'b: โw (-w: โ1)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor1: ?m.7575474w %v7; %v9 := pair:%v1 %v8; %v10 := op:orw: โw %v9; %v11 := pair:%v4 %v5; %v12 := op:orw: โw %v11; %v13 := pair:%v10 %v12; %v14 := op:xorw: โw %v13 dsl_ret %v14 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.7573911TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.7580962w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โb)) %v9999; %v6 := op:const (Bitvec.ofInt'b: โw (-w: โ1)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor1: ?m.7579454w %v7; %v9 := pair:%v1 %v8; %v10 := op:orw: โw %v9; %v11 := pair:%v4 %v5; %v12 := op:orw: โw %v11; %v13 := pair:%v1 %v5; %v14 := op:xorw: โw %v13 dsl_ret %v14 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โaโ) let x_1 โ some (Bitvec.ofInt' wโ โbโ) let x_2 โ some (Bitvec.ofInt' wโ (-1)) let x_3 โ some (Bitvec.ofInt' wโ โaโ) let x_4 โ some (Bitvec.ofInt' wโ (-1)) let x_5 โ some (Bitvec.ofInt' wโ โbโ) pure (Bitvec.xor (Bitvec.or x (Bitvec.xor x_1 x_2)) (Bitvec.or (Bitvec.xor x_3 x_4) x_5))) โ do let fst โ some (Bitvec.ofInt' wโ โaโ) let snd โ some (Bitvec.ofInt' wโ โbโ) pure (Bitvec.xor fst snd)โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.xor (Bitvec.or (Bitvec.ofInt' wโ โaโ) (Bitvec.xor (Bitvec.ofInt' wโ โbโ) (Bitvec.ofInt' wโ (-1)))) (Bitvec.or (Bitvec.xor (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.ofInt' wโ โbโ))) โ some (Bitvec.xor (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ))โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2617 -- precondition: true /- %na = xor %a, -1 %nb = xor %b, -1 %op0 = and %a, %nb %op1 = and %na, %b %r = xor %op0, %op1 => %na = xor %a, -1 %nb = xor %b, -1 %op0 = and %a, %nb %op1 = and %na, %b %r = xor %a, %b -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typeaa: โb :b: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.7817198TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.7820295w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โb)) %v9999; %v6 := op:const (Bitvec.ofInt'b: โw (-w: โ1)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor1: ?m.7818761w %v7; %v9 := pair:%v1 %v8; %v10 := op:andw: โw %v9; %v11 := pair:%v4 %v5; %v12 := op:andw: โw %v11; %v13 := pair:%v10 %v12; %v14 := op:xorw: โw %v13 dsl_ret %v14 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.7817198TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.7824249w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โb)) %v9999; %v6 := op:const (Bitvec.ofInt'b: โw (-w: โ1)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor1: ?m.7822741w %v7; %v9 := pair:%v1 %v8; %v10 := op:andw: โw %v9; %v11 := pair:%v4 %v5; %v12 := op:andw: โw %v11; %v13 := pair:%v1 %v5; %v14 := op:xorw: โw %v13 dsl_ret %v14 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โaโ) let x_1 โ some (Bitvec.ofInt' wโ โbโ) let x_2 โ some (Bitvec.ofInt' wโ (-1)) let x_3 โ some (Bitvec.ofInt' wโ โaโ) let x_4 โ some (Bitvec.ofInt' wโ (-1)) let x_5 โ some (Bitvec.ofInt' wโ โbโ) pure (Bitvec.xor (Bitvec.and x (Bitvec.xor x_1 x_2)) (Bitvec.and (Bitvec.xor x_3 x_4) x_5))) โ do let fst โ some (Bitvec.ofInt' wโ โaโ) let snd โ some (Bitvec.ofInt' wโ โbโ) pure (Bitvec.xor fst snd)โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.xor (Bitvec.and (Bitvec.ofInt' wโ โaโ) (Bitvec.xor (Bitvec.ofInt' wโ โbโ) (Bitvec.ofInt' wโ (-1)))) (Bitvec.and (Bitvec.xor (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.ofInt' wโ โbโ))) โ some (Bitvec.xor (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ))โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2627 -- precondition: true /- %op0 = xor %a, %c %op1 = or %a, %b %r = xor %op0, %op1 => %na = xor %a, -1 %and = and %na, %b %op0 = xor %a, %c %op1 = or %a, %b %r = xor %and, %c -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ โ โ (a b c_2 : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โc_2)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w โc_2)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typeaa: โcc: โbb: โaa: โbb: โc :c: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.8059219TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โc)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xorc: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โb)) %v9999; %v6 := pair:%v1 %v5; %v7 := op:orb: โw %v6; %v8 := pair:%v4 %v7; %v9 := op:xorw: โw %v8 dsl_ret %v9 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.8059219TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.8064736w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โb)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:andb: โw %v6; %v8 := op:const (Bitvec.ofInt'w: โw (w: โc)) %v9999; %v9 := pair:%v1 %v8; %v10 := op:xorc: โw %v9; %v11 := pair:%v1 %v5; %v12 := op:orw: โw %v11; %v13 := pair:%v7 %v8; %v14 := op:xorw: โw %v13 dsl_ret %v14 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ โ โ (a b c : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โc)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w โc)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โcโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' wโ โcโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ โ โ (a b c : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โc)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w โc)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โaโ) let x_1 โ some (Bitvec.ofInt' wโ โcโ) let x_2 โ some (Bitvec.ofInt' wโ โaโ) let x_3 โ some (Bitvec.ofInt' wโ โbโ) pure (Bitvec.xor (Bitvec.xor x x_1) (Bitvec.or x_2 x_3))) โ do let x โ some (Bitvec.ofInt' wโ โaโ) let x_1 โ some (Bitvec.ofInt' wโ (-1)) let x_2 โ some (Bitvec.ofInt' wโ โbโ) let snd โ some (Bitvec.ofInt' wโ โcโ) pure (Bitvec.xor (Bitvec.and (Bitvec.xor x x_1) x_2) snd)โ (w : โ), โ โ โ โ โ โ โ (a b c : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โc)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w โc)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.xor (Bitvec.xor (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โcโ)) (Bitvec.or (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ))) โ some (Bitvec.xor (Bitvec.and (Bitvec.xor (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.ofInt' wโ โbโ)) (Bitvec.ofInt' wโ โcโ))โ (w : โ), โ โ โ โ โ โ โ (a b c : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โc)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w โc)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2647 -- precondition: true /- %op0 = and %a, %b %op1 = xor %a, %b %r = xor %op0, %op1 => %op0 = and %a, %b %op1 = xor %a, %b %r = or %a, %b -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typeaa: โb :b: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.8294114TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โb)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andb: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:xorw: โw %v5; %v7 := pair:%v4 %v6; %v8 := op:xorw: โw %v7 dsl_ret %v8 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.8294114TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โb)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andb: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:xorw: โw %v5; %v7 := pair:%v1 %v2; %v8 := op:orw: โw %v7 dsl_ret %v8 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โaโ) let x_1 โ some (Bitvec.ofInt' wโ โbโ) let x_2 โ some (Bitvec.ofInt' wโ โaโ) let x_3 โ some (Bitvec.ofInt' wโ โbโ) pure (Bitvec.xor (Bitvec.and x x_1) (Bitvec.xor x_2 x_3))) โ do let fst โ some (Bitvec.ofInt' wโ โaโ) let snd โ some (Bitvec.ofInt' wโ โbโ) pure (Bitvec.or fst snd)โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.xor (Bitvec.and (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ)) (Bitvec.xor (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ))) โ some (Bitvec.or (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ))โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2658 -- precondition: true /- %nb = xor %b, -1 %op0 = and %a, %nb %na = xor %a, -1 %r = xor %op0, %na => %and = and %a, %b %nb = xor %b, -1 %op0 = and %a, %nb %na = xor %a, -1 %r = xor %and, -1 -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 14 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typeaa: โb :b: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.8455062TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โb)) %v9999; %v2 := op:const (Bitvec.ofInt'b: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.8457732w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v6 := pair:%v5 %v4; %v7 := op:anda: โw %v6; %v8 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v9 := pair:%v5 %v8; %v10 := op:xor1: ?m.8455827w %v9; %v11 := pair:%v7 %v10; %v12 := op:xorw: โw %v11 dsl_ret %v12 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.8455062TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โb)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andb: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v6 := pair:%v2 %v5; %v7 := op:xor1: ?m.8460664w %v6; %v8 := pair:%v1 %v7; %v9 := op:andw: โw %v8; %v10 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v11 := pair:%v1 %v10; %v12 := op:xor1: ?m.8459746w %v11; %v13 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v14 := pair:%v4 %v13; %v15 := op:xor1: ?m.8459143w %v14 dsl_ret %v15 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 14 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 14 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 14 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โaโ) let x_1 โ some (Bitvec.ofInt' wโ โbโ) let x_2 โ some (Bitvec.ofInt' wโ (-1)) let x_3 โ some (Bitvec.ofInt' wโ โaโ) let x_4 โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.xor (Bitvec.and x (Bitvec.xor x_1 x_2)) (Bitvec.xor x_3 x_4))) โ do let x โ some (Bitvec.ofInt' wโ โaโ) let x_1 โ some (Bitvec.ofInt' wโ โbโ) let snd โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.xor (Bitvec.and x x_1) snd)โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 14 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.xor (Bitvec.and (Bitvec.ofInt' wโ โaโ) (Bitvec.xor (Bitvec.ofInt' wโ โbโ) (Bitvec.ofInt' wโ (-1)))) (Bitvec.xor (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ (-1)))) โ some (Bitvec.xor (Bitvec.and (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ)) (Bitvec.ofInt' wโ (-1)))โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 14 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eGoals accomplished! ๐